package _220317;


import java.util.Arrays;
import java.util.Scanner;

/** tags；二分 + 贪心
 * 当每个机器人清扫的范围相差不大时 耗时最少
 *  花费时间最少等价于每个机器人花费的时间相等(机器人同时清扫) 即每个机器人清扫的范围相同
 */
public class _扫地机器人 {
    static int n, k;
    static int[] robots;

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        n = scanner.nextInt();
        k = scanner.nextInt();
        robots = new int[k];
        for (int i = 0; i < k; i++) {
            robots[i] = scanner.nextInt();
        }
        scanner.close();
        Arrays.sort(robots);

        int l = 0;
        int r = n;
        // 二分求每个机器人的扫地范围
        while (l < r) {
            int mid = l + (r - l) / 2;
            if (check(mid)) {
                r = mid;
            } else {
                l = mid + 1;
            }
        }
//        System.out.println(l);    // l == r
//        System.out.println(r);    // l == r

        /** 清扫范围：0 ... l... r (l == r)
         *  二分结束之后得到机器人需要清扫的扫地范围[l, r]（此时 l == r） 可以理解为二分结束后机器人只剩下一个
         *  且处于 l 这个位置上  l 位置的左右边都是空位置（需要清扫的区域）
         *  则花费的时间就是 从 l 向左清扫的距离 + 从 l 向右清扫的距离 =
         *  (l + l)(清扫和回到原位置共两趟) + 0(即 r - l == 0) = 2 * l
         */
        int ans = 2 * l;
        System.out.println(ans);
    }

    /**
     * 判断扫地范围为 dist 的机器人清扫的最后右边界（curPos）能否大于等于走廊最远位置n
     * @param dist
     * @return
     */
    private static boolean check(int dist) {
        int curPos = 0; // 当前位置
        for (int i = 0; i < k; i++) {
            if (robots[i] - curPos <= 1 + dist) {  // 可以到达下一个机器人位置
                // 机器人在当前位置右边（当前位置离下一个机器人有一段距离）
                // 即当前位置与下一个机器人之间的范围还未被清扫 可以使当前机器人进行清扫
                if (robots[i] - curPos > 0) {   // 故当前机器人从上一个清扫到达的最后位置继续清扫
                    curPos += dist + 1;    // 更新当前机器人清扫到达的位置
                }
            }
            // 当前位置超过下一个机器人的位置（当前机器人已经处于清扫过的位置 则当前机器人只清扫右边区域）
            else if (robots[i] - curPos <= 0) {
                curPos += dist + robots[i] - curPos;
            }
        }
        if (curPos >= n) {  //最大可到达位置大于走廊最远位置n
            return true;
        } else {
            return false;
        }
    }
}